Dette afsnit indeholder en gennemgang af XML-funktioner og -konventioner til hurtigt opslag.
Enkeltdelene i et XML-dokument
Et XML-dokument består af følgende enkeltdele i den nævnte rækkefølge:
XML-erklæringer
XML-erklæringen skal hvis den medtages stå som den første linie i et XML-dokument. Den fortæller hvilken XML-version, dokumentet overholder, og om filen indeholder henvisninger til andre filer, f.eks.:
<?xml version="1.0" standalone="no"?>DOCTYPE-erklæringer (herunder DTD'er)
DOCTYPE-erklæringen der angiver dokumentets DTD skal stå efter XML-erklæringen og inden rodelementets åbningskode. Der er to mulige dele i enhver DTD: Det eksterne undersæt og det interne undersæt. Hvis et dokument kun har et eksternt undersæt, kan det se således ud:
<?xml version="1.0" standalone="no">Hvis et dokument kun har et enkelt internt undersæt kan det se således ud:
<?xml version="1.0" standalone="yes">Hvis et dokument indeholder både et eksternt undersæt og et internt undersæt, kan det se således ud:
<?xml version="1.0" standalone="no">Elementer
Et element består af en åbningskode (<kodeNavn>), indhold og en lukkekode (</kodeNavn>):
<kodeNavn>Indhold følger her.</kodeNavn>En undtagelse er den tomme kode der kan bestå af en enkelt kode med en almindelig skråstreg inden det afsluttende >-tegn:
<tomKode/>Alle elementer skal indskydes flettes korrekt, dvs. den sidst åbnede kode skal lukkes, inden du kan lukke andre koder. Den følgende linie er f.eks. ugyldig i et XML-dokument, fordi den ikke lukker <kode2>, inden den lukker <kode1>:
<kode1><kode2>Indhold følger her.</kode1></kode2>Hvert XML-dokument skal indeholde et rodelement der indeholder alle andre elementer i dokumentet.
Der skelnes mellem store og små bogstaver i elementnavne. Hvert elementnavn skal starte med et bogstav eller en understreg (_). Efterfølgende tegn i navnet kan være bogstaver, understreger, tal, bindestreger og punktummer, men ikke mellemrum eller tabulatorer.
Attributter
Elementer kan indeholde attributter som en del af deres åbningskode (eller for tomme elementer en del af en enkelt åbnings-/lukkekode). En attribut består af et attributnavn efterfulgt af et lighedstegn samt attributværdien i anførselstegn, f.eks.:
<elementNavn attributNavn="attributVærdi">Indhold</elementNavn>Kommentarer
En kommentar består af tekst mellem <!-- og -->. Indholdet i kommentarer skal ignoreres af XML-processorerne. Kommentarer må ikke indeholde "--", og de må ikke indeholde andre kommentarer.
<!-- Dette er en kommentar. Tegn som f.eks. < og > er tilladte her. -->Behandlingsinstruktioner
En behandlingsinstruktion består af tekst mellem <? og ?>. Behandlingsinstruktioner læses kun af XML-processorer og må ikke bestå af indhold. Syntaksen for behandlingsinstruktioner er således:
<?målinstruktion?>Tegnhenvisninger
En tegnhenvisning er en metode til repræsentation af Unicode-tegn i analyserede tegndata. Syntaksen for tegnhenvisninger er denne:
&#UnicodetegnVærdi;Entitetshenvisninger
En entitetshenvisning er et navn, der repræsenterer et bestemt tegn, tekststreng eller fil. Entitetshenvisninger i et XML-dokument står altid mellem et og-tegn (&) og et semikolon (;). > repræsenterer f.eks. et større-end-tegn (<), der kun må inkluderes i XML-indhold hvis det optræder som en entitetshenvisning.
Betydningen af hver entitetshenvisning der anvendes i et XML-dokument skal være defineret i dokumentets DTD, med undtagelse af følgende foruddefinerede tegn der ikke skal defineres for at kunne anvendes:
Tegn | Entitetshenvisning |
< | < |
> | > |
& | & |
" | " |
' | ' |
Veludformede ("well-formed") XML'er
For at kunne betragtes som veludformet skal et XML-dokument overholde disse regler:
Gyldige XML'er
Et gyldigt XML-dokument er et XML-dokument, der er veludformet og overholder den DTD, der er angivet i dets DOCTYPE-erklæring.
Dette afsnit indeholder en gennemgang af DTD-funktioner og -konventioner til hurtigt opslag.
Delene i en DTD
En DTD kan sammensættes af følgende dele (rækkefølgen er underordnet):
Elementtypeerklæringer
Syntaksen for en elementtypedefinition er følgende:
<!ELEMENT elementNavn (elementIndhold)>Der skelnes mellem store og små bogstaver i elementnavne. Hvert elementnavn skal starte med et bogstav eller en understreg (_). Efterfølgende tegn i navnet kan være bogstaver, understreger, tal, bindestreger og punktummer, men ikke mellemrum eller tabulatorer.
Elementindhold kan bestå af analyserede tegndata (dvs. tekst og entitetshenvisninger, udtrykt som #PCDATA) og/eller andre elementtyper. Følgende symboler kan indsættes efter ethvert elementnavn eller lukkeparentes i definitionen af elementindholdet:
Symbol | Betydning |
Intet | Nøjagtigt én |
+ | En eller flere |
* | Nul eller flere |
? | Nul eller en |
For at bestemme at et element skal efterfølges af et andet skal du anvende et komma:
<!ELEMENT elementNavn (element1, element2)>For at indikere at et element kan indeholde et element eller et andet skal du anvende tegnet |:
<!ELEMENT elementNavn (element1 | element2)>For at tillade at et element kan indeholde en kombination af bestemte elementer og #PCDATA i en vilkårlig rækkefølge, skal du anvende følgende syntaks:
<!ELEMENT elementNavn (#PCDATA | element1 | element2)*>For at tillade at et element kan indeholde enhver kombination af elementer og #PCDATA i en vilkårlig rækkefølge skal du anvende følgende syntaks (bemærk, at parenteserne er udeladt):
<!ELEMENT elementNavn ANY>For at definere et tomt element skal du anvende den følgende syntaks (bemærk, at parenteserne er udeladt):
<!ELEMENT elementNavn EMPTY>Attributerklæringer
Syntaksen for en enkelt attributdefinition er således:
<!ATTLIST elementNavn attributNavn attributType standardVærdi>Der skelnes mellem store og små bogstaver i attributnavne. Hvert attributnavn skal starte med et bogstav eller en understreg (_). Efterfølgende tegn i navnet kan være bogstaver, understreger, tal, bindestreger og punktummer, men ikke mellemrum eller tabulatorer.
Attributtyperne kan være følgende:
Attributtype | Betydning |
CDATA | Tegndata og entitetshenvisninger i anførselstegn ("") |
ID | Skal indeholde et unikt navn* for hvert element af denne type |
IDREF | Det unikke ID-navn* på et element i XML-filen |
ENTITY | Et ikke-analyseret eksternt entitetshenvisningsnavn* defineret i DTD'en |
ENTITIES | En liste med ENTITY-navne adskilt af mellemrum |
Opremsning | En liste med navne* i parentes adskilt med tegnet | |
NMTOKEN | En værdi der kun indeholder NavnTegn-tegn** |
NMTOKENS | En liste med NMTOKEN'er adskilt med mellemrum |
NOTATION | Navnet på en notation defineret i DTD'en |
Opremsnings-NOTATION | En liste med NOTATION'er i parentes adskilt med tegnet | |
*Navne skal starte med et bogstav eller en understreg (_). Efterfølgende tegn i navnet kan være bogstaver, understreger, tal, bindestreger og punktummer, men ikke mellemrum eller tabulatorer.
**NavnTegn-tegn omfatter bogstaver, understreger, tal, bindestreger eller punktummer, men ikke mellemrum eller tabulatorer.
Standardattributværdierne kan være følgende
Attributtype | Betydning |
#REQUIRED | Denne attribut skal specificeres af elementet |
#IMPLIED | Denne attribut skal ikke nødvendigvis anvendes |
#FIXED værdi | Angives attributten ikke, antages den at have værdi; hvis den er angivet, skal den være værdi |
standardVærdi | Angives attributten ikke, antages den at have standardVærdi |
Kommentarer
En kommentar består af tekst mellem <!-- og -->. Indholdet i en kommentar bør ignoreres af XML-processorer. Kommentarer må ikke indeholde "--", og de må ikke indeholde andre kommentarer.
<!-- Dette er en kommentar. Tegn som f.eks. < og > er tilladte her. -->Tegnhenvisninger
En tegnhenvisning er en metode til repræsentation af Unicode-tegn i analyserede tegndata. Syntaksen for tegnhenvisninger er denne:
&#UnicodetegnVærdi;Erklæring af entitetshenvisninger
Der findes fem entitetstyper. Syntaksen for deres erklæringer er således:
Type | Syntaks |
Analyseret intern | <!ENTITY entitetsNavn "entitetstekst"> |
Analyseret ekstern | <!ENTITY entitetsNavn SYSTEM "URL-adresse til fil"> ELLER <!ENTITY entitetsNavn PUBLIC "filnavn" "URL-adresse til fil"> |
Ikke-analyseret ekstern | <!ENTITY entitetsNavn SYSTEM "URL-adresse til fil" NDATA notationsNavn> ELLER <!ENTITY entitetsNavn PUBLIC "filnavn" "URL-adresse til fil" NDATA notationsNavn> |
Intern parameter | <!ENTITY % entitetsNavn "entitetstekst"> |
Ekstern parameter | <!ENTITY % entitetsNavn SYSTEM "URL-adresse til fil"> ELLER <!ENTITY % entitetsNavn PUBLIC "filnavn" "URL-adresse til fil"> |
Syntaksen for anvendelse af de tre første typer entitetshenvisninger er &entitetsNavn;. Syntaksen for anvendelse af en parameterentitet er %entitetsNavn;. Parameterentitetshenvisninger analyseres altid og kan kun anvendes i en DTD.
Notationserklæringer
Notationserklæringer bør specificeres på af de følgende to måder:
<!NOTATION notationsNavn SYSTEM "Ekstern identifikator">Den eksterne identifikator bør være navnet på et program, der kan behandle eller vise de filer, notationen anvendes på, f.eks.:
<!NOTATION gif SYSTEM "Microsoft Internet Explorer">Bemærk: Det er op til det program der behandler XML'en at videregive URL-adressen til det program der er angivet med den eksterne identifikator.
Behandlingsinstruktioner
En behandlingsinstruktion består af tekst mellem <? og ?>. Behandlingsinstruktioner læses kun af XML-processorer og må ikke bestå af indhold. Syntaksen for behandlingsinstruktioner er således:
<?målinstruktion?>Lad os antage, at du lige har eksporteret en XML-fil fra avenue.quark, og ved gennemsyn af filen i en teksteditor ser du et lille "a" med en accent, hvor du regnede med at finde et varemærkesymbol. I virkeligheden ser en række af dine specialtegn forkerte ud. Hvad er der sket?
Det er mest sandsynligt at teksteditoren ikke understøtter den tegnkodning, der er anvendt i XML-filen. Dette afsnit forklarer detaljeret om dette emne.
Hvad er en tegnkodning?
En tegnkodning er en specifikation der knytter et tegnsæt sammen med de tilhørende numeriske værdier. ASCII-tegnkodningen knytter f.eks. tegnet "M" til den numeriske værdi 77, "N" til 78, "O" til 79 osv.
Når en tekstfil tegnkodes betyder det, at et program kan fortolke tekstfilen og vise de korrekte tegn på skærmen. Uden tegnkodning ville en tekstfil blot være en række tal. Hvis du ser på en tekstfil med en forkert tegnkodning, ser du sandsynligvis noget nonsens, fordi det program der åbnede filen knytter de numeriske værdier til et forkert tegnsæt.
Følgende er standard-tegnkodninger:
Avenue.quark understøtter UTF-8-, UTF-16- og Shift-JIS-tegnkodningerne.
Nedre og øvre tegnområder
Du kan opdele de fleste tegnkodninger i to dele: De første 128 tegn (det nedre område) og alle tegn derover (der øvre område).
Det nedre område i de fleste tegnkodninger er stort set bundet til de samme tegn. Området indeholder tegnene a-z, A-Z, 0-9, en række tegnsætningstegn og visse særlige kontroltegn.
Det er, når du bevæger dig op i det øvre område, at du kan komme i vanskeligheder. MacRoman og Windows Latin 1 indeholder f.eks. nedre områder der stort set er identiske. Hvis du derfor tager en fil hvori der kun anvendes tegn fra dette område og flytter filen fra Mac OS til Windows, ser det fint ud. Men hvis filen indeholder tegn fra det øvre område, får du sikkert nogle mærkelige resultater, fordi en lang række af værdierne i det øvre område er knyttet sammen med forskellige tegn på hver platform. Et tegn der viser et varemærkesymbol i MacOS vises f.eks. som et hævet lille A i Windows.
Når tegnene vises forkert er det enten fordi programmet der viser teksten ikke kender tekstens tegnkodning, eller fordi programmet ikke kan vise teksten korrekt med den tegnkodning der er angivet i filen.
Angivelse af tegnkodninger
Du kan angive en XML-fils tegnkodning ved at inkludere en tegnkodningsspecifikation i filens XML-erklæring som her:
<?xml version="1.0" standalone="yes" encoding="Shift_JIS"?>Hvis en XML-fil ikke indeholder en tegnkodningsspecifikation, antager avenue.quark at filen anvender UTF-8-tegnkodningen.
Når du gemmer en XML-fil fra avenue.quark, angiver du dokumentets tegnkodning i lokalmenuen Tegnkodning, hvorefter avenue.quark automatisk indsætter den korrekte tegnkodningsattribut.
Tegnkodninger og DTD'er
I XML kan du angive tegnkodningen i et XML-fil. Men i XML findes der ingen metode til angivelse af tegnkodningen i en enkeltstående DTD-fil.
Det gør det heldigvis i avenue.quark. For at angive tegnkodningen af en fritstående DTD skal du blot tilføje følgende tekst som den første linie i filen:
<? xml encoding="encodingName" ?>Vil du f.eks. specificere en fritstående DTD som en UTF-16-DTD, skal du blot tilføje denne linie i starten af filen:
<? xml encoding="UTF-16" ?>